#ifndef ___fat32_recursos_y_bloqueos_funciones_auxiliares_2

#define ___fat32_recursos_y_bloqueos_funciones_auxiliares_2 1

#include "f32_base.c"
#include <stdlib.h>

unsigned char fat32_obtener_bloqueo_sobre_elemento(unsigned long long);
unsigned char fat32_determinar_efecto_bloqueo_sobre_elemento(unsigned char, unsigned long long, unsigned long long, unsigned char);
char ** fat32_obtener_ruta_descriptor(unsigned long long);
unsigned char fat32_bloqueo_transaccion_sobre_elemento(unsigned long long, unsigned int);

unsigned char fat32_obtener_bloqueo_sobre_elemento (unsigned long long descriptor) {
  unsigned int posicionActual;
  unsigned char bloqueosActuales = 0;
  for (posicion = 0; posicion < fat32_recursos.cantArchivos; posicion ++)
    bloqueosActuales = fat32_determinar_efecto_bloqueo_sobre_elemento(bloqueosActuales, descriptor, 
                                                                      fat32_recursos.archivos[posicion].descriptor,
                                                                      fat32_recursos.archivos[posicion].nivel);
  return bloqueosActuales;
}

unsigned char fat32_determinar_efecto_bloqueo_sobre_elemento (unsigned char nivelActual, unsigned long long descriptorActual,
                                                              unsigned long long descriptorNuevo, unsigned char nivelNuevo) {
  char ** ruta1;
  char ** ruta2;
  ruta1 = fat32_obtener_ruta_descriptor(descriptorActual);
  ruta2 = fat32_obtener_ruta_descriptor(descriptorNuevo);
  if (!(ruta1 && ruta2)) return nivelActual;
  unsigned char resultado = fat32_comparar_rutas(ruta1, ruta2);
  switch (resultado) {
  case FAT32_RUTAS_COINCIDEN:
    return fb_maximo(nivelActual, nivelNuevo);
  case FAT32_RUTAS_DIFIEREN: case FAT32_RUTAS_DIFIEREN_UN_NIVEL:
    return nivelActual;
  case FAT32_RUTAS_1_INCLUYE_2:
    return nivelActual;
  case FAT32_RUTAS_2_INCLUYE_1:
    if (nivelNuevo > 5) return 3; else return nivelActual;
  }
}

char ** fat32_obtener_ruta_descriptor (unsigned long long descriptor) {
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_recursos.cantDescriptores; posicion ++)
    if (((fat32_recursos.descriptores)[posicion]).descriptor == descriptor)
      return ((fat32_recursos.descriptores)[posicion]).ruta;
  return NULL;
}

unsigned char fat32_bloqueo_transaccion_sobre_elemento (unsigned long long descriptor, unsigned int transaccion) {
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_recursos.cantArchivos; posicion ++)
    if ((fat32_recursos.archivos[posicion].descriptor == descriptor) && (fat32_recursos.archivos[posicion].transaccion == transaccion))
      return fat32_recursos.archivos[posicion].nivel;
  return 0;
}

#endif